/**
 * 
 */
package model;

import java.io.IOException;

import model.container.Cursussen;
import model.container.LectorenException;
import persistenty.TekstPersisteerbaar;

/**
 * 
 * Setup of the lector object. This object has different variables:<br>
 * A. a list of Lectoren coming from model.container<br>
 * B. an association with the Cursus object<br>
 * C. Some local variables lectorCode, lectorNaam and aantalGewensteUren
 * 
 * @author Nicolas Vanderhulst
 * @version 20111009
 * */
public class Lector implements Comparable<Lector>, Cloneable, TekstPersisteerbaar {

	private Cursus cursusVoorkeur;
	private int lectorCode = -1;
	private String lectorNaam;
	private int aantalGewensteUren;

	/**
	 * @return the cursusVoorkeur
	 */
	public Cursus getCursusVoorkeur() {
		return cursusVoorkeur;
	}

	/**
	 * @param cursusVoorkeur
	 *            the cursusVoorkeur to set
	 */
	public void setCursusVoorkeur(Cursus cursusVoorkeur) {
		this.cursusVoorkeur = cursusVoorkeur;
	}

	/**
	 * @return the lectorCode
	 */
	public int getLectorCode() {
		return lectorCode;
	}

	/**
	 * @param lectorCode
	 *            the lectorCode to set
	 */
	public void setLectorCode(int lectorCode) {
		this.lectorCode = lectorCode;
	}

	/**
	 * @return the lectorNaam
	 */
	public String getLectorNaam() {
		return lectorNaam;
	}

	/**
	 * @param lectorNaam
	 *            the lectorNaam to set
	 */
	public void setLectorNaam(String lectorNaam) {
		this.lectorNaam = lectorNaam;
	}

	/**
	 * @return the aantalGewensteUren
	 */
	public int getAantalGewensteUren() {
		return aantalGewensteUren;
	}

	/**
	 * @param aantalGewensteUren
	 *            the aantalGewensteuren to set
	 */
	public void setAantalGewensteUren(int aantalGewensteUren) {
		this.aantalGewensteUren = aantalGewensteUren;
	}

	// Default Constructor
	public Lector() {

	}

	// Create Basic Constructor
	public Lector(int lc, String ln, int gewensteUren, Cursus cv) throws IllegalArgumentException {
		this.setLectorCode(lc);
		this.setLectorNaam(ln);
		this.setAantalGewensteUren(gewensteUren);
		this.setCursusVoorkeur(cv);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "cursusVoorkeur=" + cursusVoorkeur + ", lectorCode=" + lectorCode + ", lectorNaam=" + lectorNaam
				+ ", aantalGewensteUren=" + aantalGewensteUren + "]";
	}

	@Override
	public Lector clone() {
		Lector tempLector = new Lector();
		tempLector.setID(this.getID());
		tempLector.setLectorNaam(this.getLectorNaam());
		tempLector.setCursusVoorkeur(this.getCursusVoorkeur());
		tempLector.setAantalGewensteUren(this.aantalGewensteUren);
		return tempLector;
	}

	@Override
	public int compareTo(Lector o) {
		Lector l = o;
		if (l.hashCode() < o.hashCode()) {
			return -1;
		} else if (l.hashCode() > o.hashCode()) {
			return 1;
		} else {
			if (l.lectorNaam.hashCode() < o.lectorNaam.hashCode()) {
				return -1;
			} else if (l.lectorNaam.hashCode() > o.lectorNaam.hashCode()) {
				return 1;
			} else {
				return 0;
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + aantalGewensteUren;
		result = prime * result + ((cursusVoorkeur == null) ? 0 : cursusVoorkeur.hashCode());
		result = prime * result + lectorCode;
		result = prime * result + ((lectorNaam == null) ? 0 : lectorNaam.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Lector)) {
			return false;
		}
		Lector other = (Lector) obj;
		if (aantalGewensteUren != other.aantalGewensteUren) {
			return false;
		}
		if (cursusVoorkeur == null) {
			if (other.cursusVoorkeur != null) {
				return false;
			}
		} else if (!cursusVoorkeur.equals(other.cursusVoorkeur)) {
			return false;
		}
		if (lectorCode != other.lectorCode) {
			return false;
		}
		if (lectorNaam == null) {
			if (other.lectorNaam != null) {
				return false;
			}
		} else if (!lectorNaam.equals(other.lectorNaam)) {
			return false;
		}
		return true;
	}

	@Override
	public Lector maakObjectVanTekst(String input) throws IOException, NumberFormatException, LectorenException {
		Lector tempLector = new Lector();
		String[] tokens = input.split("\t");
		// Opvullen variabelen
		tempLector.setID(Integer.parseInt(tokens[0]));
		tempLector.setLectorNaam(tokens[1]);
		tempLector.setAantalGewensteUren(Integer.parseInt(tokens[2]));
		return tempLector;
	}

	public void invullenCursusvoorkeurVanTekst(String input, Cursussen cursussen) {
		String[] tokens = input.split("\t");
		if (tokens.length > 3) {
			for (Cursus c : cursussen) {
				if (c.getCursusNaam().equalsIgnoreCase(tokens[3])) {
					Cursus tempClone = c.clone();
					this.setCursusVoorkeur(tempClone);
				}
			}
		}
	}

	@SuppressWarnings("boxing")
	@Override
	public String maakTekstVanObject() {
		return String.format("%s\t%s\t%s\t%s\n", this.getID(), this.getLectorNaam(), this.getAantalGewensteUren(), this
				.getCursusVoorkeur().getCursusNaam());
	}

	@Override
	public void setID(int id) {
		lectorCode = id > 0 ? id : lectorCode;

	}

	@Override
	public int getID() {

		return lectorCode;
	}

}
